/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import ConexionBD.ConexionBD;
import GestorEquipos.Entrena;
import GestorEquipos.Equipo;
import GestorEquipos.EquipoBD;
import GestorEquipos.Juega;

import Controladores.ControladorJugador;
import Controladores.ControladorEquipo;

import GestorJugadores.Jugador;
import GestorJugadores.JugadorBD;
import GestorUsuarios.Entrenador;
import GestorUsuarios.Usuario;

import Interfaz.InterfazEquipo;
import Interfaz.InterfazJugador;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * @author ihssan
 * @version 1.0
 * @created 28-mar-2013 20:53:35
 */
public class ControladorEquipo {

	private static ControladorEquipo instanciaControladorEquipo = null;
        
        private List<Equipo> equipos = new ArrayList<Equipo>();

        private int equipoActivo = -1;

        
        private ArrayList<Usuario> entrenadores = new ArrayList<Usuario>();
        private Entrena entrena;
        
        

        private ArrayList<Juega> jug_asignados =new ArrayList<Juega>();
        private ArrayList<Jugador> jug_libres =new ArrayList<Jugador>();


        
        
        
        

	public ControladorEquipo(){
            equipoActivo = -1;
	}
        
        public static ControladorEquipo getInstancia(){
            if (instanciaControladorEquipo == null) {
                instanciaControladorEquipo = new ControladorEquipo();
            }
                
                return instanciaControladorEquipo;
	}

        /**
         * @brief Crea un Objeto Equipo y lo añade a la BD
         * @param datos : Array de String que contiene los datos obtenidos del formulario
         * @return null
         */
        public Boolean addEquipo(String[] datos) {
            String nombre = datos[0];                  // Obtenemos el nombre del equipo        
            String cat = datos[1];                     // Obtenemos la categoria del equipo        
            Boolean anadido = true;
            Character gen;                             // Obtenemos el genero del Equipo
            if (datos[2].equals("M")){
                gen = 'M';
            } else {
                gen = 'F';
            }
            
            Boolean estado = null;
            if(datos[3].equals("activo")) 
                estado = true;
            else if (datos[3].equals("baja"))
                estado = false;
            Equipo eq = new Equipo(nombre, cat, gen,estado);   // Creamos el objeto
            try {
                eq = EquipoBD.getIntance().addEquipo(eq);       // Añadimos el objeto a la BD  
                equipos.add(eq);
                equipoActivo = 0;
            } catch (Exception e) {
                anadido = false;
            }
            if (anadido) {
                InterfazEquipo.getInstancia().mostrarMensaje("Equipo Añadido con Exito", "Añadir Equipo", 1);
            }
            else {
                InterfazEquipo.getInstancia().mostrarMensaje("no se puede añadir el equipo", "Añadir Equipo", 1);                
            }
            return anadido;
        }
        
        /**
         * @brief consulta los equipos que estan en la BD
         * @param datos Array de String que contiene los datos obtenidos del formulario
         * @return null
         */
        public Boolean getEquipos(String nombre, String cat) {
            String genero, estado;
            try {
               equipos = EquipoBD.getIntance().getEquipos(nombre, cat);
               equipoActivo = 0;
            } catch (Exception e) {
                equipos = null;
            }            
            if (equipos.size() > 0) {      // si encontramos equipos los visualizamos
                InterfazEquipo.getInstancia().activarTabla(Boolean.TRUE);       // Visualizamos la tabla
                InterfazEquipo.getInstancia().set_Filas_tabla(equipos.size());
                for (int i=0; i<equipos.size(); i++){       // Rellenamos la tabla con nombres  categorias
                    InterfazEquipo.getInstancia().addEquipoTabla(i, equipos.get(i).getNombre(),
                                                                    equipos.get(i).getCategoria());
                }
            
                // Añadimos el prier equipo encontrado
                if(equipos.get(equipoActivo).getEstado())
                    estado = "activo";
                else 
                    estado = "baja";
                InterfazEquipo.getInstancia().mostrarEquipo(equipos.get(equipoActivo).getNombre(), equipos.get(equipoActivo).getCategoria(),
                        equipos.get(equipoActivo).getGenero(), estado);           
                return true;
            }
            else {
                InterfazEquipo.getInstancia().mostrarMensaje("No se han encontrado equipos con los datos introducidos", "No hay datos", 1);
                return false;
            }
        }
        
        public Boolean updateEquipo(String [] datos) {
            Boolean estado = null;
            Boolean modificado = null;
            String nombre, cat;
            Character gen;
            
            if (!datos[0].equals("") && !datos[0].equals(equipos.get(equipoActivo).getNombre()))       // Establecer nombre
                nombre = datos[0];
            else
                nombre = equipos.get(equipoActivo).getNombre();
            
            if (!datos[1].equals("") && !datos[1].equals(equipos.get(equipoActivo).getCategoria()))    // Establecer Categoria
                cat = datos[1];
            else
                cat = equipos.get(equipoActivo).getCategoria();
            
            if (!datos[2].equals("") && !datos[2].equals(equipos.get(equipoActivo).getGenero())) {
                if (datos[2].equals("M"))
                    gen = 'M';
               else 
                    gen = 'F';            
            }
            else {
                gen = equipos.get(equipoActivo).getGenero().charAt(0);
            }
            
            if (!datos[3].equals("")) {             // Establecer el estado
                if (datos[3].equals("activo"))
                    estado = true;
                else 
                    estado = false;
            }     
            else
                estado = equipos.get(equipoActivo).getEstado();
            
            Equipo eq = new Equipo(nombre, cat, gen, estado);       // Crear el objeto
            eq.setIdEquipo(equipos.get(equipoActivo).getIdEquipo());
            
            try {
                 modificado = EquipoBD.getIntance().updateEquipo(eq);
                 equipos.set(equipoActivo, eq);
            } catch (Exception e) {
                modificado = false;
            }
            if (modificado) {
                InterfazEquipo.getInstancia().mostrarMensaje("Equipo modificado con Exito", "Añadir Equipo", 1);
            }
            else {
                InterfazEquipo.getInstancia().mostrarMensaje("no se puede modificar el equipo", "Añadir Equipo", 1);                
            }
            return modificado;
        }
        
        
        public Boolean refrescarEquipo(Integer fila) {
            String estado;
            
            if (equipoActivo == -1) {
                return false;
            }
            else if (fila != null)
                equipoActivo = fila;
            if(equipos.get(equipoActivo).getEstado())
                    estado = "activo";
                else 
                    estado = "baja";
            InterfazEquipo.getInstancia().mostrarEquipo(equipos.get(equipoActivo).getNombre(), equipos.get(equipoActivo).getCategoria(),
                                                        equipos.get(equipoActivo).getGenero(), estado); 
            return true;
        }
        
        
        
        
       
        
        /*
         *              ENTRENADOR
         */
        
        /*
        public Boolean addEntrenador(String[] datos) {
            
            Entrena entr = new Entrena();
                entrena = new Entrena[1];
                // Enviar a la BD
                entrena[0]=EquipoBD.getIntance().addEntrena(entr);
                if (entrena[0]!=null){ // Entrena añadido con exito
 
                    InterfazEquipo.getInstancia().mostrarMensaje("Entrenador añadido con éxito","OK", 1);
                    return true;
                } else { // Error con la BD
                    InterfazEquipo.getInstancia().mostrarMensaje("Error al introducir el entrenador en un equipo.\nIntentelo de nuevo.", "Error en la Base de Datos", 0);
                    return false;
                }

           
        }
        
        */
        
        public Boolean addEntrenador( int seleccionado, int lugar, int accion){
            
            entrena.setEquipo(equipos.get(equipoActivo));
            //Entrenador principal
            if(lugar == 0){
                entrena.setEntrenadorP(entrenadores.get(seleccionado));
                entrena.setEntrenadorS(null);
                
                if(accion == 0){
                    EquipoBD.getIntance().addEntrenaPrincipal(entrena);
                }
                else{
                    return EquipoBD.getIntance().updateEntrenaPrincipal(entrena);
                }
                return true;
            }
            else{//Entrenado segundo
                entrena.setEntrenadorS(entrenadores.get(seleccionado));
               
                if(accion == 0){
                    EquipoBD.getIntance().addEntrenaSegundo(entrena);
                }
                else{
                    return EquipoBD.getIntance().updateEntrenaSegundo(entrena);
                }
                return true;
            }
            
            
            
            
        }
        
        public Boolean deleteEntrenador( int lugar, int accion){
            
            entrena.setEquipo(equipos.get(equipoActivo)) ;
            //Entrenador principal
            if(lugar == 0){
                
                if(accion == 0){
                    EquipoBD.getIntance().deleteEntrena(entrena);
                }
                else{
                    EquipoBD.getIntance().deleteEntrena(entrena);
                    EquipoBD.getIntance().addEntrenaSegundo(entrena);
                }
                return true;
            }
            else{//Entrenado segundo
                               
                if(accion == 0){
                    EquipoBD.getIntance().deleteEntrena(entrena);
                }
                else{
                    EquipoBD.getIntance().deleteEntrena(entrena);
                    EquipoBD.getIntance().addEntrenaPrincipal(entrena);
                }
                return true;
            }
        }
        
        public void getEntrenadores_Equipos(){
            
            entrenadores.clear();

            
            entrenadores = EquipoBD.getIntance().getEntrenadores_Libres( equipos.get(equipoActivo) );
            
            
            entrena = EquipoBD.getIntance().getEntrenadores_Asignados(equipos.get(equipoActivo));

            
            
            InterfazEquipo.getInstancia().MostrarEntrenadores(entrenadores, entrena);
        }

        
        
        
        
        
        
        
        
        
        
        
        
        /*
         *                  JUEGA
         */
        
         
        public void add_Jugador_Equipo(int dorsal, int pos_jug){
             
            Equipo equi = equipos.get(equipoActivo);
           
            Jugador juga = jug_libres.get(pos_jug);

            Juega  jueg = new Juega(dorsal, equi, juga);
                   
            if(EquipoBD.getIntance().addJuega(jueg) != null){
                jug_asignados.add(jueg);
                jug_libres.remove(juga);
                InterfazEquipo.getInstancia().MostrarJugadoresEquipo(jug_libres, jug_asignados);

            }else{                 
                InterfazEquipo.getInstancia().mostrarMensaje("No se ha podido añadir el jugador", "Jugador no añadido", 0);
            }
            
        }
        
        
         public void getLibres_Asignados_Equipos(){
            
            
           // int idEquipo = equipos.get(equipoActivo).getIdEquipo();
            //Equipo equip = EquipoBD.getIntance().getEquipo(idEquipo);
               
            Equipo equip = equipos.get(equipoActivo);

            jug_libres = EquipoBD.getIntance().getJugadores_Libres(equip);

            jug_asignados = EquipoBD.getIntance().getJugadores_Asignados(equip);
              
            InterfazEquipo.getInstancia().MostrarJugadoresEquipo(jug_libres, jug_asignados);
        }
        
        
        
        /*
         * Método que comprueba si el dorsal puesto al jugador en el equipo no está ya dado. 
         */
        public Boolean dorsalAsignado(Integer dorsal){
            
            if(dorsal == null || dorsal == -1)
                return false;
            
            
            
            for(int i = 0 ; i < jug_asignados.size(); ++i){
                if(jug_asignados.get(i).getDorsal() == dorsal) {
                    return false;
                }
            }
                
            return true;
        }
        
        
        public void delete_Jugador_Equipo(Integer indice){
            
            Juega  jueg = jug_asignados.get(indice);
            
            if(EquipoBD.getIntance().deleteJuega(jueg)){
            
            jug_libres.add(jueg.getJugador());
            jug_asignados.remove(jueg);

            
            InterfazEquipo.getInstancia().MostrarJugadoresEquipo(jug_libres, jug_asignados);

            
            }else{                 
                InterfazEquipo.getInstancia().mostrarMensaje("No se puede eliminar el Jugador", "Imposible eliminar jugador", 0);
            }
            
            
        }
        
        
      
        
        
        
        
      /*  
         public Juega VerificarDatosCorrectosJuega(String []datos){
        // Si algo incorrecto avisar a la interfaz y mostrar mensaje
          try{
                 Integer.parseInt(datos[0][0]);
                 ControladorEquipo.getInstanciaControladorEquipo().VerificarDatosCorrectosEquipo(datos[1]);
                 
                     Jugador newjuga = VerificarDatosCorrectosJugador(datos[2]);
                 ControladorVerificarDatos algo;
                 Jugador newjug = algo.VerificarDatosCorrectosJugador(datos);
                 
            }
            catch (NumberFormatException nfe)
            {   
                
                //InterfazJugador.getInstancia().marcarErrores(anioNacimiento, cuotadeInscripcion, cuotadeInscripcion2, cuotaMensual, cuotaTotal);
            }
              return new Juega(Integer.parseInt(datos[0]),null,newjuga);
               // return new Juega(Integer.parseInt(datos[0]),  Double.parseDouble(datos[1]), Double.parseDouble(datos[2]), Double.parseDouble(datos[3]), datos[4]);
                
        }
        */
        
       
 
       
        


        
       
        
        
        
       
        
}
